# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：DouBanSpider
#   文件名：10 解析class=item标签.py
# 开发时间：2021/4/1 9:18

# _*_ coding:utf-8 _*_
# 开发团队: Mavericks
# 开发人员：Maverick·Ming
# 开发IDE： PyCharm
#   项目名：DouBanSpider
#   文件名：09 爬取10个电影页面.py
# 开发时间：2021/4/1 8:40

# 引入所需模块
import re  # 网页解析，获取数据
from bs4 import BeautifulSoup  # 正则表达式，进行文字匹配
import urllib.request,urllib.error  # 制定URL，获取网页数据
import xlwt  # 进行excel操作
import sqlite3  # 进行SQLite数据库操作


def main():  # 整体工作流程
    print('hello！开始爬取...')
    baseurl = 'https://movie.douban.com/top250?start='
    # 获取数据
    datalist = getData(baseurl)
    savepath = 'data/豆瓣电影Top250.xls'


# 影片详情链接的规则/正则表达式/字符串模式
findLink = re.compile('<a href="(.*?)">')  # 调用re库compile创建一个解析对象,说明解析链接的规则
# print('findLink的类型:', type(findLink))  # 测试,查看类型;结果,re.pattern
# 正则表达式<a href="(.*?)">意思是<a href="开头">结尾且中间有0-*个任意字符.
# findLink 是字符串模式re.pattern,值是一个正则表达式

# 定义爬取并解析数据的函数
def getData(baseurl):
    datalist = []
    for i in range(0, 10):  # 调用获取页面信息的函数，10次
        url = baseurl + str(i * 25)  # url封装
        html = askURL(url)  # 保存获取一个网页的源码
        # 2.逐一解析数据, 找到每个电影item以及item里的内容
        soup = BeautifulSoup(html, 'html.parser')  # 传入一个网页html,对其使用html.parser解析器
        # 为了对每个item进行操作,利用for循环
        for item in soup.find_all('div', class_="item"): # 找正则表达式=div且属性class_是item的所有标签内容
            data = []  # 保存电影的每一个信息
            item = str(item)  # 将item转换为字符串类型,为转换之前是Tag类型,没办法解析
            # print(item)  # 小测试,查看所有的item是否正常获取,结果正常
            # 先将电影链接解析出来,首先写一个有正则表达式的解析对象findLink(全局变量)
            # 接着应用解析对象,把电影链接分析出来
            # movie_link = re.findall(findLink, item)  # 调用re.findall(解析规则, 被解析对象)
            # print(movie_link)  # 小测试,查看解析出来的movie_link是否正常,结果,列表类型输出(因为没限定第一个)
            movie_link = re.findall(findLink, item)[0]  # 调用re.findall(利用规则, 在item文档树里解析信息)
            # print(movie_link)  # 小测试,查看解析出来的movie_link是否只有一个字符串,结果,每个item只解析了一个link
    return datalist


# 得到一个指定url的网页信息内容（只获取其中一个页面的爬取，但是需要250/25=10个页面，就需要些循环调用）
def askURL(url):
    head = {  # 模拟浏览器头部信息，向豆瓣服务器发送消息
        "User-Agent": "Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36"
    }  # head里的变量值User-Agent用户代理,告诉服务器，我们是浏览器访问，不是爬虫
    # 接着将请求对象封装起来
    req = urllib.request.Request(url, headers=head)
    html = ""
    # 发送请求，并接受返回源码，可能会出现异常，为了捕获异常用上try语句
    try:
        response = urllib.request.urlopen(req)  # respone对象接受返回的网页信息
        html = response.read().decode('utf-8')  # 将网页信息中的html信息解码给html
        # print(html)
    except urllib.error.URLError as e:
        if hasattr(e, 'code'):
            print(e.code)
        if hasattr(e, 'reason'):
            print(e.reason)
    finally:
        return html


# 程序入口，确保程序执行的流程
if __name__ == '__main__':  # 当程序被调用执行时, 按照此语句入口的顺序执行程序，不至于乱序调用
    # 调用函数
    main()
    print('Haha! 爬取完成，请查看movie250.html')